﻿#pragma once

#include <QObject>
#include "../../model/kcalculate/kcalculate.h"
#include "../../view/kdisplayview/kdisplayview.h"
#include "../kinputhandler/kinputhandler.h"
#include "../../model/kexpressionbuffer/kexpressionbuffer.h"
#include "../../widgets/khistorypopup/khistorypopup.h"

//这个类是控制器层，用于连接model，view，inputhandler

class CalculatorController : public QObject {
    Q_OBJECT
public:
    //初始化控制器，绑定视图、输入器、模型
    CalculatorController(DisplayView* view,
        InputHandler* input,
        Calculator* model,
        QObject* parent = nullptr);

    ~CalculatorController() {};

    // 获取表达式缓冲对象的引用
    ExpressionBuffer& getBuffer();

    // 更新 UI 显示的主结果栏和表达式栏
    void updateDisplay();

private slots:
    //处理数字按钮点击
    void onDigit(QChar key);

    //处理运算符按钮点击
    void onOperator(QChar key);

    //处理括号按钮点击
    void onParenthesis(QChar key);

    //处理小数点按钮点击
    void onPoint(QChar key);

    //处理清除当前输入按钮
    void onClearEntry();

    //处理清除按钮点击
    void onClear();

    //处理退格按钮点击
    void onBack();

    //处理等号按钮点击（计算）
    void onEqual();

    //处理倒数 1/x 按钮点击
    void onInverse();

    //处理平方按钮点击
    void onSquare();

    //处理开根按钮点击
    void onSqrt();

    //处理相对百分比按钮点击,但是这个是处理的前一个运算符的百分比是多少，意思就是不是完全的除以100.0，那个逻辑在calculate类里面
    void onRelativePercent();

    //处理删除按钮点击
    void onDelete();

    //处理正负号切换按钮点击
    void onNegate();

    //处理前进按钮点击
    void onForward();

    //处理点击历史记录项的结果
    void onHistoryResultSelected(const QString& result);

private:
    // UI 显示视图指针
    DisplayView* m_pview;
    // 输入事件处理器指针
    InputHandler* m_pinputHandler;
    // 模型计算器指针
    Calculator* m_pmodel;

    // 表达式缓冲区对象（主数据容器）
    ExpressionBuffer m_exprBuffer;
    // 用于主界面显示的表达式（带格式替换）
    QString m_displayExpression;
};

